package entity

import (
	"reflect"
	"src/zeus/iserver"

	log "src/zeus/logger"
)

// ProtoType 保存实体映射列表
type ProtoType struct {
	entityProtoType map[string]reflect.Type
}

// NewProtoType 创建新的对象
func NewProtoType() *ProtoType {
	return &ProtoType{
		entityProtoType: make(map[string]reflect.Type),
	}
}

// RegProtoType 注册原型
func (es *ProtoType) RegProtoType(name string, protoType iserver.IEntity) {

	if protoType == nil {
		log.Error("ProtoType is nil", name)
		return
	}

	_, ok := es.entityProtoType[name]
	if ok {
		log.Warn("Registed type", name)
		return
	}

	t := reflect.TypeOf(protoType)
	es.entityProtoType[name] = t
	/*
	   注册ntt类型，可以实现自动远程创建对像的逻辑，现在不用。
	*/
	// types, types2 := global.GetGlobalInst().GetGlobalIntSlice("EntitySrvTypes:" + name)
	// // only not space entity should be register to server type list
	// if _, ok := protoType.(iserver.ISpaceEntity); !ok {
	// 	// dbservice.EntityTypeUtil(name).RegSrvType(iserver.GetSrvInst().GetSrvType())
	// 	curType := iserver.GetSrvInst().GetSrvType()
	// 	for _, typ := range types {
	// 		if typ == int(curType) {
	// 			return
	// 		}
	// 	}

	// 	types = append(types, int(curType))
	// } else {
	// 	curType2 := iserver.GetSrvInst().GetSrvType()
	// 	for _, typ2 := range types2 {
	// 		if typ2 == int(curType2) {
	// 			return
	// 		}
	// 	}

	// 	types2 = append(types2, int(curType2))
	// }
	// global.GetGlobalInst().SetGlobalIntSlice("EntitySrvTypes:"+name, types, types2)
}

// NewEntityByProtoType 创建 一个对象
func (es *ProtoType) NewEntityByProtoType(entityType string) interface{} {
	proto, ok := es.entityProtoType[entityType]
	if !ok {
		log.Error("Entity type not exist", entityType)
		return nil
	}

	e := reflect.New(proto.Elem()).Interface()
	return e
}
